package com.sample.core.mybatis.service;

import java.util.List;

/**
 * @Description: 基础Service接口
 * @Author: Chen Xingjie
 * @Date: 2019/1/22
 */
public interface CommonService <T>{
    /**
     *
     * 功能：查询返回单条记录
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public T selectOne(T record);

    /**
     *
     * 功能：根据主键进行查询,必须保证结果唯一,单个字段做主键时,可以直接写主键的值,联合主键时,key可以是实体类,也可以是Map
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param obj
     * @return
     */
    public T selectByPrimaryKey(Object obj);

    /**
     *
     * 功能：根据实体类不为null的字段进行查询,条件全部使用=号and条件
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record 实体
     * @return
     */
    public List<T> select(T record);

    /**
     *
     * 功能：根据实体类不为null的字段查询总数,条件全部使用=号and条件
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record 实体
     * @return
     */
    public int selectCount(T record);
    
    /**
     *
     * 功能：根据Example条件进行查询
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param example
     * @return
     */
    public List<T> selectByExample(Object example);

    /**
     *
     * 功能：插入一条数据
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public int insert(T record) ;

    /**
     *
     * 功能：插入一条数据,只插入不为null的字段,不会影响有默认值的字段
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public int insertSelective(T record) ;

    /**
     *
     * 功能：根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public int delete(T record) ;

    /**
     *
     * 功能：通过主键进行删除,这里最多只会删除一条数据,单个字段做主键时,可以直接写主键的值,联合主键时,key可以是实体类,也可以是Map
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param key
     * @return
     */
    public int deleteByPrimaryKey(Object key) ;

    /**
     *
     * 功能：根据主键进行更新,这里最多只会更新一条数据
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public int updateByPrimaryKey(T record) ;

    /**
     *
     * 功能：根据主键进行更新,只会更新不是null的数据
     * @author Chen Xingjie
     * @date 2019/1/22
     * @param record
     * @return
     */
    public int updateByPrimaryKeySelective(T record) ;


    public List<T> selectAll() ;
}
